home *** CD-ROM | disk | FTP | other *** search
- #if !defined(lint) && !defined(DOS)
- static char rcsid[] = "$Id: main.c,v 4.37 1996/03/15 07:41:11 hubert Exp $";
- #endif
- /*
- * Program: Main stand-alone Pine Composer routines
- *
- *
- * Michael Seibel
- * Networks and Distributed Computing
- * Computing and Communications
- * University of Washington
- * Administration Builiding, AG-44
- * Seattle, Washington, 98195, USA
- * Internet: mikes@cac.washington.edu
- *
- * Please address all bugs and comments to "pine-bugs@cac.washington.edu"
- *
- *
- * Pine and Pico are registered trademarks of the University of Washington.
- * No commercial use of these trademarks may be made without prior written
- * permission of the University of Washington.
- *
- * Pine, Pico, and Pilot software and its included text are Copyright
- * 1989-1996 by the University of Washington.
- *
- * The full text of our legal notices is contained in the file called
- * CPYRIGHT, included with this distribution.
- *
- *
- * WEEMACS/PICO NOTES:
- *
- * 08 Jan 92 - removed PINE defines to simplify compiling
- *
- * 08 Apr 92 - removed PINE stub calls
- *
- */
-
- #include <stdio.h>
- #include <setjmp.h>
- #include "osdep.h" /* operating system dependent includes */
- #include "pico.h" /* pine composer definitions */
- #include "estruct.h" /* global structures and defines */
- #include "efunc.h" /* function declarations and sans name table */
- #include "edef.h" /* global definitions */
-
-
- /*
- * Useful internal prototypes
- */
- #ifdef _WINDOWS
- int pico_file_drop(int, int, char *);
- #endif
-
- /*
- * this isn't defined in the library, because it's a pine global
- * which we use for GetKey's timeout
- */
- int timeoutset = 0;
-
- /*
- * function key mappings
- */
- static int fkm[12][2] = {
- { F1, (CTRL|'G')},
- { F2, (CTRL|'X')},
- { F3, (CTRL|'O')},
- { F4, (CTRL|'J')},
- { F5, (CTRL|'R')},
- { F6, (CTRL|'W')},
- { F7, (CTRL|'Y')},
- { F8, (CTRL|'V')},
- { F9, (CTRL|'K')},
- { F10, (CTRL|'U')},
- { F11, (CTRL|'C')},
- #ifdef SPELLER
- { F12, (CTRL|'T')}
- #else
- { F12, (CTRL|'D')}
- #endif
- };
-
-
- /*
- * main standalone pico routine
- */
- #ifdef _WINDOWS
- app_main (argc, argv)
- #else
- main(argc, argv)
- #endif
- char *argv[];
- {
- register int c;
- register int f;
- register int n;
- register BUFFER *bp;
- register int carg; /* current arg to scan */
- int viewflag = FALSE; /* are we starting in view mode?*/
- int starton = 0; /* where's dot to begin with? */
- char bname[NBUFN]; /* buffer name of file to read */
- char *clerr = NULL; /* garbage on command line */
-
- timeout = 600;
- Pmaster = NULL; /* turn OFF composer functionality */
- km_popped = 0;
- opertree[0] = '\0';
- opertree[NLINE] = '\0';
-
- /*
- * Read command line flags before initializing, otherwise, we never
- * know to init for f_keys...
- */
- carg = 1;
- while(carg < argc){
- if(argv[carg][0] == '-'){
- switch(argv[carg][1]){
- case 'v': /* -v for View File */
- case 'V':
- viewflag = !viewflag;
- break;
- case 'e': /* file name completion */
- gmode ^= MDCMPLT;
- break;
- case 'k': /* kill from dot */
- gmode ^= MDDTKILL;
- break;
- case 'g': /* show-cursor in file browser */
- gmode ^= MDSHOCUR;
- break;
- case 'm': /* turn on mouse support */
- gmode ^= MDMOUSE;
- break;
- case 'x': /* suppress keyhelp */
- sup_keyhelp = !sup_keyhelp;
- break;
- case 'd': /* -d for rebind delete key */
- bindtokey(0x7f, forwdel);
- break;
- case 'f': /* -f for function key use */
- gmode ^= MDFKEY;
- break;
- case 'r': /* set fill column */
- if(argv[carg][2] != '\0')
- if((userfillcol = atoi(&argv[carg][2])) < 1)
- userfillcol = 72;
- break;
- case 'n': /* -n for new mail notification */
- timeoutset = 1;
- timeout = 180;
- if(argv[carg][2] != '\0')
- if((timeout = atoi(&argv[carg][2])) < 30)
- timeout = 180;
- break;
- case 's' :
- if(argv[carg+1] && argv[carg+1][0] && argv[carg+1][0] != '-')
- alt_speller = argv[++carg];
- /* BUG: should gripe if test fails */
- break;
- case 't': /* special shutdown mode */
- gmode ^= MDTOOL;
- rebindfunc(wquit, quickexit);
- break;
- case 'o' : /* operating tree */
- if(argv[carg+1] && argv[carg+1][0] && argv[carg+1][0] != '-'){
- strncpy(opertree, argv[++carg], NLINE);
- gmode ^= MDTREE;
- }
- else{
- printf("Missing or empty argument to -o flag isn't allowed\n");
- exit(1);
- }
- break;
- case 'z': /* -z to suspend */
- gmode ^= MDSSPD;
- break;
- case 'w': /* -w turn off word wrap */
- gmode ^= MDWRAP;
- break;
- #if defined(DOS) || defined(OS2)
- case 'c': /* -c[nr][fb] colors */
- if(carg + 1 < argc){
- if(argv[carg][2] == 'n'){
- if(argv[carg][3] == 'f')
- pico_nfcolor(argv[++carg]);
- else if(argv[carg][3] == 'b')
- pico_nbcolor(argv[++carg]);
- }
- else if(argv[carg][2] == 'r'){
- if(argv[carg][3] == 'f')
- pico_rfcolor(argv[++carg]);
- else if(argv[carg][3] == 'b')
- pico_rbcolor(argv[++carg]);
- }
- }
- else{
- clerr = "insufficient args for \"-c\"";
- break;
- }
- break;
- #endif
- default: /* huh? */
- clerr = argv[carg];
- break;
- }
- carg++;
- }
- else if(argv[carg][0] == '+'){ /* leading '+' is special */
- starton = atoi(&argv[carg][1]);
- carg++;
- }
- else /* pick up file name later... */
- break;
- }
-
- if(!vtinit()) /* Displays. */
- exit(1);
-
- strcpy(bname, "main"); /* default buffer name */
- edinit(bname); /* Buffers, windows. */
-
- update(); /* let the user know we are here */
-
- #ifdef _WINDOWS
- mswin_allowpaste(MSWIN_PASTE_FULL);
- mswin_setclosetext("Use the ^X command to exit Pico.");
- mswin_setscrollcallback (pico_scroll_callback);
- #endif
-
- #if defined(TERMCAP) || defined(TERMINFO) || defined(VMS)
- if(pico_kbesc == NULL){ /* will arrow keys work ? */
- (*term.t_putchar)('\007');
- emlwrite("Warning: keypad keys may non-functional", NULL);
- }
- #endif /* TERMCAP/TERMINFO/VMS */
-
- if(carg < argc){ /* Any file to edit? */
-
- makename(bname, argv[carg]); /* set up a buffer for this file */
-
- bp = curbp; /* read in first file */
- makename(bname, argv[carg]);
- strcpy(bp->b_bname, bname);
- strcpy(bp->b_fname, argv[carg]);
- if (readin(argv[carg], (viewflag==FALSE)) == ABORT) {
- strcpy(bp->b_bname, "main");
- strcpy(bp->b_fname, "");
- }
- bp->b_dotp = bp->b_linep;
- bp->b_doto = 0;
-
- if (viewflag) /* set the view mode */
- bp->b_mode |= MDVIEW;
- }
-
- /* setup to process commands */
- lastflag = 0; /* Fake last flags. */
- curbp->b_mode |= gmode; /* and set default modes*/
-
- curwp->w_flag |= WFMODE; /* and force an update */
-
- if(timeoutset)
- emlwrite("Checking for new mail every %D seconds", (void *)timeout);
-
- if(clerr){ /* post any errors on command line */
- if(mpresf) /* show earlier message though! */
- sleep(2);
- emlwrite("\007Unknown option: %s", clerr);
- }
-
- forwline(0, starton - 1); /* move dot to specified line */
-
- while(1){
-
- if(km_popped){
- km_popped--;
- if(km_popped == 0) /* cause bottom three lines to be repainted */
- curwp->w_flag |= WFHARD;
- }
-
- if(km_popped){ /* temporarily change to cause menu to be painted */
- term.t_mrow = 2;
- curwp->w_ntrows -= 2;
- curwp->w_flag |= WFMODE;
- movecursor(term.t_nrow-2, 0); /* clear status line, too */
- peeol();
- }
-
- update(); /* Fix up the screen */
- if(km_popped){
- term.t_mrow = 0;
- curwp->w_ntrows += 2;
- }
-
- #ifdef MOUSE
- #ifdef EX_MOUSE
- /* New mouse function for real mouse text seletion. */
- register_mfunc(mouse_in_pico, 2, 0, term.t_nrow - (term.t_mrow + 1),
- term.t_ncol);
- #else
- mouse_in_content(K_MOUSE, -1, -1, 0, 0);
- register_mfunc(mouse_in_content, 2, 0, term.t_nrow - (term.t_mrow + 1),
- term.t_ncol);
- #endif
- #endif
- #ifdef _WINDOWS
- mswin_setdndcallback (pico_file_drop);
- #endif
- c = GetKey();
- #ifdef MOUSE
- #ifdef EX_MOUSE
- clear_mfunc(mouse_in_pico);
- #else
- clear_mfunc(mouse_in_content);
- #endif
- #endif
- #ifdef _WINDOWS
- mswin_cleardndcallback ();
- #endif
-
- if(timeoutset && (c == NODATA || time_to_check())){
- if(pico_new_mail())
- emlwrite("You may possibly have new mail.", NULL);
- }
-
- if(km_popped)
- switch(c){
- case NODATA:
- case (CTRL|'L'):
- km_popped++;
- break;
-
- default:
- /* clear bottom three lines */
- mlerase();
- break;
- }
-
- if(c == NODATA)
- continue;
-
- if(mpresf){ /* erase message line? */
- if(mpresf++ > MESSDELAY)
- mlerase();
- }
-
- f = FALSE;
- n = 1;
-
- #ifdef MOUSE
- clear_mfunc(mouse_in_content);
- #endif
- /* Do it. */
- execute(normalize_cmd(c, fkm, 1), f, n);
- }
- }
-
-
- #ifdef _WINDOWS
- /*
- *
- */
- int
- pico_file_drop(x, y, filename)
- int x, y;
- char *filename;
- {
- /*
- * if current buffer is unchanged
- * *or* "new buffer" and no current text
- */
- if(((curwp->w_bufp->b_flag & BFCHG) == 0)
- || (curwp->w_bufp->b_fname[0] == '\0'
- && curwp->w_bufp->b_linep == lforw(curwp->w_bufp->b_linep)
- && curwp->w_doto == 0)){
- register BUFFER *bp = curwp->w_bufp;
- char bname[NBUFN];
-
- makename(bname, filename);
- strcpy(bp->b_bname, bname);
- strcpy(bp->b_fname, filename);
- bp->b_flag &= ~BFCHG; /* turn off change bit */
- if (readin(filename, 1) == ABORT) {
- strcpy(bp->b_bname, "");
- strcpy(bp->b_fname, "");
- }
- bp->b_dotp = bp->b_linep;
- bp->b_doto = 0;
- }
- else{
- ifile(filename);
- curwp->w_flag |= WFHARD;
- update();
- emlwrite("Inserted dropped file \"%s\"", filename);
- }
-
- curwp->w_flag |= WFHARD;
- update(); /* restore cursor */
- return(1);
- }
- #endif
-